有时需要对数据进行排序,可以根据单个条件排序,也可以根据多个条件进行排序。可以从小到大升序排列,也可以从大到小降序排列。
单条件排序
【问题描述】
根据DataFrame中的单列数据对行数据进行排序。
【示例3-31】
本例使用的Excel文件的完整路径为“D:/Samples/ch03/05 数据排序/单条件排序/身份证号-排序.xlsx”。该文件打开后如图3-22所示,是一些工作人员的身份信息。请根据工号对数据进行升序排序。
图3-22 人员身份信息
- 编写下面的代码:
import pandas as pd
# 读取Excel文件到DataFrame
df = pd.read_excel('D:/Samples/ch03/05 数据排序/单条件排序/身份证号-排序.xlsx', engine='openpyxl')
# 按工号升序排序
df.sort_values(by='工号', inplace=True)
# 打印排序后的结果
print(df)
打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存。运行脚本,在IDLE Shell窗口输出排序结果i。
>>> === RESTART: D:/Samples/ch03/1.py ==
工号 部门 姓名 身份证号 性别
0 1001 财务部 陈东 5103211978100300** 男
1 1002 财务部 田菊 4128231980052512** 女
3 1003 生产部 王伟 4302251980031135** 男
4 1004 生产部 韦龙 4302251985111635** 男
5 1005 销售部 刘洋 4302251980081235** 男
6 1006 生产部 吕川 3203251970010171** 男
7 1007 销售部 杨莉 4201171973021753** 女
2 1008 财务部 夏东 1328011947050583** 男
8 1009 销售部 吴晓 4302251980011535** 男
9 1010 销售部 宋恩龙 3203251980010181** 男
【知识点扩展】
使用DataFrame对象的sort_values方法进行排序,用该方法的by参数指定排序依据,用ascending参数设置升序还是降序,其值为False时为降序,为True时为升序。默认时为升序排列。
多条件排序
【问题描述】
指定DataFrame中的多列数据作为排序依据,可以对各列数据单独指定排序方式。
【示例3-32】
本例使用示例3-30的数据。要求首先根据性别进行升序排序,然后对于相同性别的人员用工号进行升序排列。
- 编写下面的代码:
import pandas as pd
# 读取Excel文件数据
df = pd.read_excel(r'D:/Samples/ch03/05 数据排序/多条件排序/身份证号-排序.xlsx',
sheet_name='Sheet1', engine='openpyxl', index_col=0)
# 按照性别和工号升序排序
df_sorted = df.sort_values(by=['性别', '工号'], ascending=True)
print(df_sorted)
打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存。运行脚本,在IDLE Shell窗口输出多条件排序的结果。
>>> === RESTART: D:/Samples/ch03/1.py ==
部门 姓名 身份证号 性别
工号
1002 财务部 田菊 4128231980052512** 女
1007 销售部 杨莉 4201171973021753** 女
1001 财务部 陈东 5103211978100300** 男
1003 生产部 王伟 4302251980031135** 男
1004 生产部 韦龙 4302251985111635** 男
1005 销售部 刘洋 4302251980081235** 男
1006 生产部 吕川 3203251970010171** 男
1008 财务部 夏东 1328011947050583** 男
1009 销售部 吴晓 4302251980011535** 男
1010 销售部 宋恩龙 3203251980010181** 男
可见,首先根据性别进行排序,然后对同一性别的人员按照工号进行了升序排列。
提取前3名
【问题描述】
对DataFrame中的数据进行排序后提取前N行或后N行。
【示例3-33】
本例使用的Excel文件的完整路径为“D:/Samples/ch03/05 数据排序/提取前3名/前三名.xlsx”。该文件打开后如图3-23所示,是一些同学的短跑成绩。请给出短跑前3名的人员姓名、短跑成绩和名次。
图3-23 学生短跑成绩
- 编写下面的代码:
import pandas as pd
# 读取Excel文件
excel_file = pd.read_excel('D:/Samples/ch03/05 数据排序/提取前3名/前三名.xlsx', engine='openpyxl')
# 根据短跑成绩进行升序排序,用时越少排序越靠前
sorted_data = excel_file.sort_values('短跑成绩(秒)')
# 提取前3名的人员姓名、短跑成绩和名次
top_3 = sorted_data[['姓名', '短跑成绩(秒)']].head(3)
top_3['名次'] = [1, 2, 3]
print(top_3)
打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存。运行脚本,在IDLE Shell窗口输出短跑前3名的姓名、成绩和名次。
>>> === RESTART: D:/Samples/ch03/1.py ==
姓名 短跑成绩(秒) 名次
4 吴军 18 1
2 赵毅 19 2
3 张林 20 3